package com.tomoki.iwai.deviceinfo;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.StringReader;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.simpleframework.xml.Serializer;
import org.simpleframework.xml.convert.AnnotationStrategy;
import org.simpleframework.xml.core.Persister;
import org.simpleframework.xml.stream.Format;

import com.tomoki.iwai.deviceinfo.db.dao.AndroidDeviceInfoListDao;
import com.tomoki.iwai.deviceinfo.dto.Device;

/**
 * Android Device Info登録サーブレットクラス
 */
@SuppressWarnings("serial")
public class RegisterDeviceServlet extends HttpServlet
{
	/**
	 * Postリクエストのハンドリングを行う。
	 */
	@Override
	public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException
	{
		doGet(req, resp);
	}

	/**
	 * Getリクエストのハンドリングを行う。
	 */
	@Override
	public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException
	{
		StringBuffer content = new StringBuffer();
		BufferedReader br = null;
		
		try
		{
			// リクエスト内容の読み込み
			br = new BufferedReader(new InputStreamReader(req.getInputStream()));
			
			String tmp = null;
			while ((tmp = br.readLine()) != null)
			{
				content.append(tmp);
			}
		}
		catch (Exception ignore)
		{
		}
		finally
		{
			try { br.close(); } catch (Exception ignore) {}
		}
		
		// リクエスト内容(=XML)をデシリアライズ
		Device device = toDeviceDto(content.toString());
		
		int result = 0;
		
		if (device != null)
		{
			AndroidDeviceInfoListDao dao = new AndroidDeviceInfoListDao();
			
			boolean existance = dao.isExists(device.build.FINGERPRINT);
			
			if (!existance)
			{
				dao.insert(device);
				result = 2;
			}
			else
			{
				result = 1;
			}
		}
		
		resp.setContentType("text/plain");
		resp.setCharacterEncoding("UTF-8");
		
		PrintWriter pw = resp.getWriter();
		pw.write(result == 0 ? "Failed" : result == 1 ? "Already" : "Success");
		pw.close();
	}
	
	/**
	 * XML文字列形式をDeviceオブジェクトにデシリアライズする。
	 * 
	 * @param content XML文字列
	 * @return Device
	 */
	private Device toDeviceDto(String content)
	{
		// XML宣言定義
		final String XML_PROLOG = "<?xml version='1.0' encoding='UTF-8' standalone='yes'?>";
		
		// XMLフォーマットの指定(タグ名をハイフン区切り、インデントを無し、XML宣言を追加)
		Format format = new Format(2, XML_PROLOG);
		
		// XML永続化ユーティリティを生成
		Serializer serializer = new Persister(new AnnotationStrategy(), format);
		
		try
		{
			Device device = serializer.read(Device.class, new StringReader(content));
			
			return device;
		}
		catch (Exception e)
		{
			e.printStackTrace();
			return null;
		}
	}
}
